iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Mobile Development

ios 的小小實驗室 2 !!系列 第 20

AVCaptureVideoPreviewLayer 5 - AVCaptureMetadataOutputObjectsDelegate 2

  • 分享至 

  • xImage
  •  
  1. 設定 AVCaptureMetadataOutput

    • 實例化一個 AVCaptureMetadataOutput 物件

      let metaDataOutput = AVCaptureMetadataOutput()

    • 透過 AVCaptureMetadataOutput 輸出資料

      判斷是否可以將 metaDataOutput 輸出到 captureSession

      f (captureSession?.canAddOutput(metaDataOutput) ?? false) {
      
      captureSession?.addOutput(metaDataOutput)
      
      // 設定可以處理哪些類型的條碼
      metaDataOutput.metadataObjectTypes = [.qr, .ean8, .ean13, .pdf417]
      
      scanQRCodeRectOfInterest()
      
      // 限制可掃描範圍
      metaDataOutput.rectOfInterest = CGRect(x: scanQRcodePath.bounds.minY/superViewBounds.height, y: scanQRcodePath.bounds.minX/superViewBounds.width, width: scanQRcodePath.bounds.height/superViewBounds.height, height: scanQRcodePath.bounds.width/superViewBounds.width)
      
      // 設定代理 在主執行緒裡重新整理
      metaDataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) //執行處理 QRCode
      } 
      lse {
          return
      }
      ``
       需注意的是 rectOfInterest 的部分:
      
      ![](https://i.imgur.com/16OqaYm.png)
      
      因此在 CGRect 裡,會是以這樣的方式呈現
      
        CGRect(
        	x: 可掃描區域的 Y / 螢幕的高,
        	y: 可掃描區域的 X / 螢幕的寬,
        	width: 可掃描區域的 height / 螢幕的高,
        	height: 可掃描區域的 width/ 螢幕的寬
        )
        ```
      
    • 用 AVCaptureVideoPreviewLayer 來呈現 AVCaptureSession 的資料

      / 顯示來自相機設備的視頻的核心動畫層
      aptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
      
      / 在邊界內顯示的視覺內容
      aptureVideoPreviewLayer.videoGravity = .resizeAspectFill
      
      aptureVideoPreviewLayer.frame = scanQRCodeView.layer.frame
      
      canQRCodeView.layer.addSublayer(captureVideoPreviewLayer)
      
      / 開始偵測與掃描
      aptureSession?.startRunning()
      ``
      
       videoGravity 默認值為 resizeAspect
      
      * resizeAspect:
      
      	保留其縱橫比並使其適合圖層的邊界
      
      * resizeAspectFill:
      
      	保留其縱橫比並填充圖層的邊界
      
      * resize:
      
      	拉伸以填充圖層的邊界
      
      

明天將會繼續介紹 AVCaptureMetadataOutputObjectsDelegate 裡的設定


GitHub - AVCaptureVideoPreviewLayerDemo


上一篇
AVCaptureVideoPreviewLayer 4 - AVCaptureMetadataOutputObjectsDelegate 1
下一篇
AVCaptureVideoPreviewLayer 6 - AVCaptureMetadataOutputObjectsDelegate 3
系列文
ios 的小小實驗室 2 !!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言